object TestFor {
  def main(args: Array[String]): Unit = {
    // 前闭后闭
    for (i <- 1 to 5) {
      println("宋宋，告别海狗人参丸吧" + i)
    }

    // 前闭后开  -- 与Java的for相同
    for (i <- 1 until 5) {
      println("宋宋，告别海狗人参丸吧" + i)
    }

    /**
     * 1）循环守卫，即循环保护式（也称条件判断式，守卫）。保护式为true则进入循环体内部，为false则跳过，类似于continue。
     * */
    for (i <- 1 to 5 if i != 3) {
      println(i + "宋宋")
    }

    /**
     * @ 4.4.4 循环步长
     * by 表示步长
     * */
    //    需求：输出1到10以内的所有奇数
    for (i <- 1 to 10 by 2) {
      println("i=" + i)
    }

    /**
     * 说明：没有关键字，所以范围后一定要加 ；来隔断逻辑
     * */
    for (i <- 1 to 3; j <- 1 to 3) {
      println(" i =" + i + " j = " + j)
    }
    //    上面的代码等价下面的代码
    for (i <- 1 to 3) {
      for (j <- 1 to 3) {
        println("i =" + i + " j=" + j)
      }
    }

    /**
     * （1）for推导式一行中有多个表达式时要加 ; 来隔断逻辑
     * （2）for 推导式有一个不成文的约定：当 for 推导式仅包含单一表达式时使用圆括号，
     * 当包含多个表达式时，一般每行一个表达式，并用花括号代替圆括号，如下：
     * */
    for (i <- 1 to 3; j = 4 - i) {
      println("i=" + i + " j=" + j)
    }
    for {
      i <- 1 to 3
      j = 4 - i
    } {
      println("i=" + i + " j=" + j)
    }

    // 上面的代码等价于：

    for (i <- 1 to 3) {
      var j = 4 - i
      println("i=" + i + " j=" + j)
    }

    // 需求：将原数据中所有值乘以2，并把数据返回到一个新的集合中。
    var res = for (i <- 1 to 10) yield {
      i * 2
    }
    println(res)

    //：如果想倒序打印一组数据，可以用reverse。
    for (i <- 1 to 10 reverse) {
      println(i)
    }
  }
}
